var fs = require('fs')

// EcmaScript 6 中新增了一个API Promise
// Promise 是一个构造函数
console.log(1)

// 创建 Promise 容器
// 1、给别人一个承诺 I Promise You。
// promise 容器一但创建就会执行里面的代码
var p1 = new Promise(function (resolve,reject) {
    console.log(2)
    fs.readFile('./db.json','utf8',function (err,data) {
        if (err) {
            // 失败了，承诺容器中低端任务失败了
            // console.log(err)
            // 把容器的Pending状态改为Rejected
            // 调用reject就相当于调用then方法的第二个参数function
            reject(err)
        }else {
            console.log(3)
            // 承诺容器中的任务成功了
            // console.log(data)
            // 把容器的Pending状态改为成功 Resolved
            // 也就是说这里调用的resolve方法实际上就是then方法传递的那个function

            resolve(data)
        }

        
    })
})


// console.log(4)
// p1 就是那个承诺
// 当p1 成功了然后（then） 做指定的操作
// then 方法接收的function 就是容器中的resolve 函数
// p1.then(function (data) {
//     console.log(data)
// },function (err) {
//     console.log('读取文件失败了',err)
// })


// p2 promise
var p2 = new Promise(function (resolve,reject) {
    fs.readFile('./db.json','utf8',function (err,data) {
        if (err) {
           
            reject(err)
        }else {

            resolve(data)
        }

        
    })
})

// p3 promise
var p3 = new Promise(function (resolve,reject) {
    fs.readFile('./db.json','utf8',function (err,data) {
        if (err) {
           
            reject(err)
        }else {

            resolve(data)
        }

        
    })
    
})

// 链式编程
p1.then(function (data) {
    console.log(data)
    // 当 p1 读取成功的时候
    // 当前函数中 return 的结果就可以在后面的then 中的function接收到
    // 当你 return 123 后面就接收到 123
        // return 'hello' 后面就接收到 'hello'
        // 没有return 的数据接收到的就是 undefined
    // 上面那些return 的数据没什么卵用
    // 真正有用的是：我们可以return 一个promise对象
    // 当return一个promise对象数据的时候，后续的then中的方法的第一个参数就会作为P2的resolve方法
    return p2
},function (err) {
    console.log(err)
})
.then(function (data) {
    // 这里接收到的就是P2中resolve返回来的结果
    console.log(data)
    return p3
})
.then(function (data) {
    // 这里就是接收p3中resolve返回来的数据
    console.log(data)
})
